home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / workbench werkzeuge / bildschirmschoner / bserver_v1.5 / sources.lha / Sources / server / bserver.c < prev    next >
C/C++ Source or Header  |  1995-11-08  |  19KB  |  710 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <intuition/intuition.h>
  4. #include <libraries/locale.h>
  5. #include <workbench/startup.h>
  6. #include <dos/dos.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9.  
  10. #include <proto/exec.h>
  11. #include <proto/intuition.h>
  12. #include <proto/gadtools.h>
  13. #include <proto/dos.h>
  14. #include <proto/utility.h>
  15. #include <proto/commodities.h>
  16. #include <proto/locale.h>
  17. #include <clib/alib_protos.h>
  18.  
  19. #include "/include/server.h"
  20.  
  21. /* Per la localizzazione */
  22. #define CATCOMP_NUMBERS
  23. #define CATCOMP_BLOCK
  24. #define CATCOMP_CODE
  25. #include "BServer_strings.h"
  26.  
  27. extern STRPTR __asm GetString(register __a0 struct LocaleInfo *li,
  28.                        register __d0 LONG stringNum);
  29.  
  30. /* Pulizia di una porta messaggi */
  31. extern void ClearPendingMessages(struct MsgPort *);
  32.  
  33. /* Controllo commodity */
  34. extern BOOL SetUpCommodity(int,char**);
  35. extern void RemoveCommodity(void);
  36. extern void HandleCxMessages(void);
  37.  
  38. /* Gestione finestra */
  39. extern void DetachGadgets( void );
  40. extern void AttachGadgets( void );
  41. extern BOOL PopUpWindow(void);
  42. extern void ShutWindow(void);
  43. extern void HandleWindowMessages(void);
  44. extern UWORD wleft, wtop;
  45.  
  46. /* Builtin blanker */
  47. extern BOOL PopUpBlackScreen(void);
  48. extern void CloseBlackScreen(void);
  49.  
  50. /* Fa partire i clienti nella ClientList */
  51. extern BOOL StartClient( struct ClientNode * );
  52. extern void GetClientNames( char * );
  53. extern void DropClientNames( void );
  54.  
  55. /* Alloca una dinfo per un cliente */
  56. extern struct DisplayIDInformation *AllocDisplayIDInformation( ULONG );
  57. extern struct Window *window;
  58.  
  59. /* Per la trasmissione del displayID */
  60. extern ULONG DisplayID;
  61. extern char DefaultModeName[];
  62. extern struct List *CreateModeList( void );
  63. extern void GetDisplayNodeFromName( void );
  64. extern void DeleteModeList( void );
  65.  
  66. extern struct IntuitionBase *IntuitionBase;
  67. extern struct Library *IconBase, *GadToolsBase, *UtilityBase, *CxBase;
  68. extern struct Gadget *list_gdg;
  69.  
  70. struct Library *LocaleBase;
  71. struct LocaleInfo li;
  72. char *msg_timeout, *key_timeout, *msg_changetime, *key_changetime, 
  73.      *msg_random, *key_random, *msg_hide, *key_hide, *msg_quit, *key_quit,
  74.      *msg_blank, *key_blank, *msg_killsel, *key_killsel,
  75.      *msg_addcli, *key_addcli, *msg_brilevel, *key_brilevel,
  76.      *msg_sndlevel, *key_sndlevel;
  77.  
  78. extern struct NewBroker newbroker;
  79. extern struct TagItem sourcetags[];
  80.  
  81. char *version = "$VER: "PROGRAMNAME" "PROGRAMVERSION" "__AMIGADATE__;
  82.  
  83. /* Per la notifica dei vari eventi */
  84. struct MsgPort *handlerPort, *timerMPort, *clientMPort;
  85. struct Task *thisTask;
  86. UBYTE handlerSigBit, timerSigBit;
  87. ULONG handlerSignal, timerSignal;
  88. extern ULONG CXSignal, windowSignal, timerSignal;
  89.  
  90.  
  91. BOOL StayCool = TRUE;            /* Terminazione */
  92. BOOL RandomClient = TRUE;        /* Deve essere scelto a caso? */
  93. BOOL CommodityActive = TRUE;    /* Deve effettuare il blank? */
  94. BOOL PopUp = FALSE;                /* Deve aprire la finestra? */
  95. UWORD timeElapsed;                /* Tempo passato dall'ultimo evento */
  96. UWORD delaySecs, delayEvents;    /* Secondi da passare trasform. in Ticks */
  97. UWORD changeSecs, changeEvents; /* Secondi da passare per cambiare client */
  98. UBYTE briLevel = 100;            /* Livello di luminosità */
  99. UBYTE sndLevel = 100;           /* Livello sonoro massimo */
  100. UWORD DefaultClient = 0;
  101. UWORD TotalClients = 0;    
  102. BOOL stop_on_mouse = TRUE, stop_on_disk = TRUE;
  103.  
  104. UBYTE BlankStatus = IDLE;
  105.  
  106. /* Usate nella scelta del cliente per non toccare le originali  */
  107. /* In caso di fallimento infatti vanno modificate per scandire  */
  108. /* la lista dalla fine all'inizio alla ricerca di un nuovo cli. */
  109.  
  110. UWORD copy_of_DefaultClient = (UWORD)~0;
  111. BOOL copy_of_RandomClient = (UWORD)~0;
  112.  
  113. #define BLANKING_NONE      0
  114. #define BLANKING_BUILTIN   1
  115. #define BLANKING_EXTERN    2
  116.  
  117. /* Prototipi delle funzioni */
  118. struct ClientMessage *AllocClientMessage( ULONG );
  119. void FreeClientMessage( struct ClientMessage * );
  120. struct ClientNode *FindClientNode( UWORD );
  121. void RemoveClient( UWORD, char * );
  122.  
  123. void SendCommandToClient( ULONG );
  124. void QuitClients( void );
  125. void HandleClients(void);
  126. struct MsgPort *SetUpServerPort(void);
  127. void RemoveServerPort(void);
  128.  
  129. void StartBlanking(void);
  130. void StopBlanking(void);
  131.  
  132. void ProcessUserMessages(void);
  133.  
  134.  /*************************
  135.  *                        *
  136.  * HANDLE EXTERN PROGRAMS *
  137.  *                        *
  138.  *************************/
  139.  
  140. struct MsgPort *ServerPort;
  141. ULONG serverSignal;
  142. UBYTE blankingAction;
  143.  
  144. struct List ClientsList;
  145.  
  146.  
  147. struct ServerMessage *AllocServerMessage( ULONG command )
  148. {
  149. struct ServerMessage *bmsg;
  150.  
  151. if ( bmsg = AllocVec( sizeof(struct ServerMessage), MEMF_PUBLIC | MEMF_CLEAR ) )
  152.     {
  153.     bmsg->sm_Msg.mn_Node.ln_Type = NT_MESSAGE;
  154.     bmsg->sm_Msg.mn_ReplyPort = ServerPort;
  155.     bmsg->sm_Msg.mn_Length = sizeof(struct ServerMessage);
  156.     bmsg->sm_Command = command;
  157.     }
  158. return( bmsg );
  159. }
  160.  
  161.  
  162. void FreeServerMessage( struct ServerMessage *bmsg )
  163. {
  164. FreeVec( bmsg );
  165. }
  166.  
  167.  
  168. struct ClientNode *FindClientNode( UWORD clientNumber )
  169. {
  170. struct ClientNode *node = (struct ClientNode *)ClientsList.lh_Head;
  171. UWORD counter = 0;
  172.  
  173. if ( clientNumber == ~0 )
  174.     {
  175.     DisplayBeep( NULL );
  176.     clientNumber = 0;
  177.     }
  178.  
  179. while ( counter < clientNumber )
  180.     {
  181.     counter++;
  182.     node = (struct ClientNode *)node->cn_Node.ln_Succ;
  183.     }
  184.  
  185. return( node );
  186. }
  187.  
  188.  
  189. void RemoveClient( UWORD clientNumber, char *clientName )
  190. {
  191. struct ClientNode *node;
  192.  
  193. node = FindClientNode( clientNumber );
  194.  
  195. if ( node != (struct ClientNode *)ClientsList.lh_Head )
  196.     {
  197.     DetachGadgets();
  198.     Remove( (struct Node *)node );
  199.     FreeMem( node, sizeof(struct ClientNode) );
  200.     TotalClients--;
  201.  
  202.     if ( clientNumber < TotalClients )
  203.         DefaultClient = clientNumber;
  204.     else
  205.         DefaultClient = TotalClients;
  206.  
  207.     AttachGadgets();
  208.     }
  209. }
  210.  
  211.  
  212. void SendCommandToClient( ULONG command )
  213. {
  214. struct ServerMessage *bmsg;
  215.  
  216. if ( clientMPort && (bmsg = AllocServerMessage( command )))
  217.     {
  218.     PutMsg( clientMPort, (struct Message *)bmsg );
  219.     do
  220.         WaitPort( ServerPort );
  221.     while ( !(GetMsg( ServerPort )) );
  222.  
  223.     FreeServerMessage( bmsg );
  224.     }
  225. }
  226.  
  227.  
  228. void HandleClients( void )
  229. {
  230. struct ClientMessage *bmsg;
  231.  
  232. while( bmsg = (struct ClientMessage *)GetMsg( ServerPort ) )
  233.     {
  234.     switch ( bmsg->cm_Action )
  235.         {
  236.         case ACTION_ARRIVED:
  237.             if ( BlankStatus == MUST_BLANK || BlankStatus == IDLE )
  238.                 {
  239.                 timeElapsed = 0;
  240.                 if ( copy_of_DefaultClient == ~0 )
  241.                     {
  242.                     copy_of_DefaultClient = DefaultClient;
  243.                     copy_of_RandomClient = RandomClient;
  244.                     }
  245.                 clientMPort = bmsg->cm_Msg.mn_ReplyPort;
  246.                 bmsg->DInfo = AllocDisplayIDInformation( DisplayID );
  247.                 blankingAction = BLANKING_EXTERN;
  248.                 BlankStatus = BLANKING;
  249.                 }
  250.             break;
  251.         case ACTION_FAILED:
  252.             if ( BlankStatus == BLANKING )
  253.                 {
  254.                 BlankStatus = MUST_BLANK;
  255.                 if ( RandomClient != 0 )
  256.                     {
  257.                     RandomClient = 0;
  258.                     DefaultClient = TotalClients;
  259.                     }
  260.                 else
  261.                     DefaultClient--;
  262.                 StartBlanking();
  263.                 }
  264.         default:
  265.             break;
  266.         }
  267.     ReplyMsg( (struct Message *)bmsg );
  268.     }
  269. }
  270.  
  271.  
  272. struct MsgPort *SetUpServerPort( void )
  273. {
  274. if ( ServerPort = CreatePort( SERVERPORTNAME, 0 ) )
  275.     serverSignal = 1L << ServerPort->mp_SigBit;
  276. return( ServerPort );
  277. }
  278.  
  279.  
  280. void RemoveServerPort( void )
  281. {
  282. DeletePort( ServerPort );
  283. }
  284.  
  285.  
  286.  /*****************
  287.  *                *
  288.  * Blanking stuff *
  289.  *                *
  290.  *****************/
  291.  
  292. WORD ActiveClient;
  293.  
  294. void StartBlanking( void )
  295. {
  296. ULONG secs, micr;
  297.  
  298. clientMPort = NULL;
  299.  
  300. if ( BlankStatus == MUST_BLANK )
  301.     {
  302.     if ( copy_of_DefaultClient == ~0 )
  303.         {
  304.         copy_of_DefaultClient = DefaultClient;
  305.         copy_of_RandomClient = RandomClient;
  306.         }
  307.  
  308.     if ( window )
  309.         ClearPendingMessages( window->UserPort );
  310.  
  311.     if ( TotalClients )
  312.         {
  313.         if ( RandomClient )
  314.             {
  315.             CurrentTime( &secs, &micr );
  316.             ActiveClient = micr % TotalClients + 1;
  317.             }
  318.         else
  319.             ActiveClient = DefaultClient;
  320.         }
  321.  
  322.     if ( !ActiveClient )
  323.         {
  324.         if ( PopUpBlackScreen() )
  325.             {
  326.             blankingAction = BLANKING_BUILTIN;
  327.             BlankStatus = BLANKING;
  328.             }
  329.         else
  330.             {
  331.             DisplayBeep( NULL );
  332.             blankingAction = BLANKING_NONE;
  333.             BlankStatus = BLANKING;
  334.             }
  335.         }
  336.     else
  337.         {
  338.         if ( !StartClient( FindClientNode( ActiveClient ) ) )
  339.             {
  340.             if ( RandomClient )
  341.                 {
  342.                 DefaultClient = TotalClients;
  343.                 RandomClient = 0;
  344.                 }
  345.             else
  346.                 DefaultClient--;
  347.             StartBlanking();
  348.             }
  349.         else
  350.             /* BlankStatus = BLANKING <=> ACTION_ARRIVED */
  351.             blankingAction = BLANKING_EXTERN;
  352.         }
  353.     }
  354. }
  355.  
  356.  
  357. void StopBlanking( void )
  358. {
  359. if ( blankingAction == BLANKING_BUILTIN )
  360.     CloseBlackScreen();
  361. else
  362. if ( blankingAction == BLANKING_EXTERN )
  363.     SendCommandToClient( COMMAND_QUIT );
  364.  
  365. if ( copy_of_DefaultClient != ~0 )
  366.     {
  367.     DefaultClient = copy_of_DefaultClient;
  368.     RandomClient = copy_of_RandomClient;
  369.  
  370.     copy_of_DefaultClient = (UWORD)~0;
  371.     copy_of_RandomClient = (UWORD)~0;
  372.     }
  373.  
  374. blankingAction = BLANKING_NONE;
  375. BlankStatus = IDLE;
  376. }
  377.  
  378.  
  379.  /*******************
  380.  *                  *
  381.  * PROCESS MESSAGES *
  382.  *                  *
  383.  *******************/
  384.  
  385.  
  386. void Quit( void )
  387. {
  388. StayCool = FALSE;
  389. }
  390.  
  391.  
  392. void ProcessUserMessages(void)
  393. {
  394. ULONG signal;
  395.  
  396. while( StayCool )
  397.     {
  398.     signal = Wait( CXSignal | windowSignal | serverSignal | handlerSignal | timerSignal | SIGBREAKF_CTRL_C );
  399.  
  400.     if ( signal & CXSignal )
  401.         HandleCxMessages();
  402.  
  403.     if ( signal & windowSignal )
  404.         HandleWindowMessages();
  405.  
  406.     if ( signal & serverSignal )
  407.         HandleClients();
  408.  
  409.     if ( signal & timerSignal && CommodityActive )
  410.         StartBlanking();
  411.  
  412.     if ( signal & handlerSignal )
  413.         StopBlanking();
  414.  
  415.     if ( signal & SIGBREAKF_CTRL_C )
  416.         Quit();
  417.     }
  418.  
  419. if ( BlankStatus == BLANKING )
  420.     {
  421.     BlankStatus = MUST_RETRY;
  422.     StopBlanking();
  423.     }
  424. }
  425.  
  426.  
  427.  /***************
  428.  *              *
  429.  * MAIN PROGRAM *
  430.  *              *
  431.  ***************/
  432.  
  433. #define POP_KEY_ID      100
  434.  
  435. extern CxObj *broker , *sender, *translate;
  436. CxObj *hotkeyfilter, *blankkeyfilter, *mousefilter, *timerfilter, *keyfilter;
  437.  
  438. extern struct NewBroker newbroker;
  439. extern struct MsgPort *broker_mp;
  440.  
  441.  
  442. void __interrupt __saveds BlankerAction(CxMsg *CxMsg,CxObj *CO)
  443. {
  444. struct InputEvent *IE=(struct InputEvent *)CxMsgData(CxMsg);
  445.  
  446. if ( IE->ie_Class == IECLASS_TIMER )
  447.     {
  448.     /* timeElapsed viene posto a 0 all'arrivo del cliente */
  449.  
  450.     if ( delaySecs && (BlankStatus == IDLE) && (++timeElapsed >= delayEvents) )
  451.         {
  452.         BlankStatus = MUST_BLANK;
  453.         Signal( thisTask, timerSignal );
  454.         }
  455.  
  456.     if ( BlankStatus == BLANKING && changeSecs && RandomClient && ++timeElapsed >= changeEvents )
  457.         {
  458.         BlankStatus = MUST_RETRY;
  459.         Signal( thisTask, handlerSignal );
  460.         timeElapsed = delayEvents - 1;
  461.         }
  462.     }
  463. else
  464.     {
  465.     timeElapsed = 0;
  466.     if ( BlankStatus == BLANKING && (
  467.         (IE->ie_Class == IECLASS_RAWMOUSE && (IE->ie_Code != IECODE_NOBUTTON || stop_on_mouse)) ||
  468.         ((IE->ie_Class == IECLASS_DISKREMOVED || IE->ie_Class == IECLASS_DISKINSERTED) && stop_on_disk ) ||
  469.         (IE->ie_Class == IECLASS_RAWKEY && IE->ie_Code != *key_blank) ))
  470.         {
  471.         BlankStatus = MUST_RETRY;
  472.         Signal( thisTask, handlerSignal );
  473.         }
  474.     }
  475. }
  476.  
  477.  
  478. extern struct NewMenu bservernewmenus[];
  479. extern struct EasyStruct easyabout;
  480.  
  481. void main( int argc, char *argv[] )
  482. {
  483. struct WBStartup *WBenchMsg;
  484. struct ClientNode *firstNode;
  485. CxObj *customobj;
  486. char hotkey[50], blankkey[50];
  487. char ListName[100];
  488. struct List *list;
  489.  
  490. li.li_Catalog = NULL;
  491. if ( LocaleBase = OpenLibrary( "locale.library", 38L ) )
  492.     {
  493.     li.li_LocaleBase = LocaleBase;
  494.     li.li_Catalog = OpenCatalogA( NULL, "BServer.catalog", NULL );
  495.  
  496.     msg_random = GetString( &li, MSG_RANDOM );
  497.     msg_hide = GetString( &li, MSG_HIDE );
  498.     msg_quit = GetString( &li, MSG_QUIT );
  499.     msg_blank = GetString( &li, MSG_BLANK );
  500.     msg_killsel = GetString( &li, MSG_REMOVECLIENT );
  501.     msg_addcli = GetString( &li, MSG_ADDCLIENT );
  502.     }
  503. else
  504.     {
  505.     msg_random = "Random";
  506.     msg_hide = "Hide";
  507.     msg_quit = "Quit";
  508.     msg_blank = "Blank";
  509.     msg_killsel = "Remove client";
  510.     msg_addcli = "Add client";
  511.     }
  512.  
  513. sourcetags[0].ti_Data = (ULONG)GetString( &li, MSG_SELECT_CLIENTS );
  514. newbroker.nb_Descr = GetString( &li, MSG_BROKER );
  515. msg_timeout = GetString( &li, MSG_TIMEOUT );
  516. key_timeout = GetString( &li, MSG_TIMEOUT_KEY );
  517. msg_changetime = GetString( &li, MSG_CHANGETIME );
  518. key_changetime = GetString( &li, MSG_CHANGETIME_KEY );
  519. key_random = GetString( &li, MSG_RANDOM_KEY );
  520. key_hide = GetString( &li, MSG_HIDE_KEY );
  521. key_quit = GetString( &li, MSG_QUIT_KEY );
  522. key_blank = GetString( &li, MSG_BLANK_KEY );
  523. key_killsel = GetString( &li, MSG_REMOVECLIENT_KEY );
  524. key_addcli = GetString( &li, MSG_ADDCLIENT_KEY );
  525. msg_brilevel = GetString( &li, MSG_BRILEVEL );
  526. key_brilevel = GetString( &li, MSG_BRILEVEL_KEY );
  527. msg_sndlevel = GetString( &li, MSG_SNDLEVEL );
  528. key_sndlevel = GetString( &li, MSG_SNDLEVEL_KEY );
  529. bservernewmenus[0].nm_Label = GetString( &li, MSG_MENUPROJECT );
  530. bservernewmenus[1].nm_Label = GetString( &li, MSG_MENUABOUT );
  531. bservernewmenus[1].nm_CommKey = GetString( &li, MSG_MENUABOUT_HK );
  532. bservernewmenus[2].nm_Label = GetString( &li, MSG_MENUHIDE );
  533. bservernewmenus[2].nm_CommKey = GetString( &li, MSG_MENUHIDE_HK );
  534. bservernewmenus[3].nm_Label = GetString( &li, MSG_MENUQUIT );
  535. bservernewmenus[3].nm_CommKey = GetString( &li, MSG_MENUQUIT_HK );
  536. bservernewmenus[4].nm_Label = GetString( &li, MSG_MENUINPUTEVENTS );
  537. bservernewmenus[5].nm_Label = GetString( &li, MSG_MENUIECLASSRAWMOUSE );
  538. bservernewmenus[5].nm_CommKey = GetString( &li, MSG_MENUIECLASSRAWMOUSE_HK );
  539. bservernewmenus[6].nm_Label = GetString( &li, MSG_MENUIECLASSDISK );
  540. bservernewmenus[6].nm_CommKey = GetString( &li, MSG_MENUIECLASSDISK_HK );
  541. easyabout.es_TextFormat = GetString( &li, MSG_MENUABOUTREPLY  );
  542. easyabout.es_GadgetFormat = GetString( &li, MSG_MENUABOUTGADS );
  543.  
  544. if ( IntuitionBase = (struct IntuitionBase *)OpenLibrary( "intuition.library", 37L ) )
  545.     {
  546.     if ( UtilityBase = OpenLibrary( "utility.library", 37L ) )
  547.         {
  548.         if ( argc )
  549.             {
  550.             struct RDArgs *rdargs;
  551.             LONG argres[15] = { 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L };
  552.  
  553.             if ( rdargs = ReadArgs( "CX_PRIORITY/K/N,CX_POPUP/S,CX_HOTKEY/K,BLANKKEY/K,WLEFT/N,WTOP/N,R=RANDOM/S,T=TIMEOUT/K/N,CT=CHANGETIME/K/N,D=DISPLAY/K,L=LIST/K,B=BRIGHTNESS/K/N,V=VOLUME/K/N,NM=NOMOUSE/S,ND=NODISK/S", argres, NULL ) )
  554.                 {
  555.                 newbroker.nb_Pri = ( argres[0] ? *(ULONG *)argres[0] : 0 );
  556.                 PopUp = ( argres[1] ? TRUE : FALSE );
  557.                 strcpy( hotkey, ( argres[2] ? (char *)argres[2] : "lalt b" ) );
  558.                 strcpy( blankkey, ( argres[3] ? (char *)argres[3] : "ctrl lalt b" ) );
  559.                 wleft = ( argres[4] ? (UWORD)(*(ULONG *)argres[4]) : ~0 );
  560.                 wtop = ( argres[5] ? (UWORD)(*(ULONG *)argres[5]) : ~0 );
  561.                 RandomClient = ( argres[6] ? TRUE : FALSE );
  562.                 delaySecs = ( argres[7] ? *(ULONG *)argres[7] : 60 );
  563.                 changeSecs = ( argres[8] ? *(ULONG *)argres[8] : 60 );
  564.                 if ( argres[9] )
  565.                     strcpy( DefaultModeName, (char *)argres[9] );
  566.                 strcpy( ListName, ( argres[10] ? (char *)argres[10] : "ClientList" ) );
  567.                 briLevel = ( argres[11] ? *(ULONG *)argres[11] : 100 );
  568.                 sndLevel = ( argres[12] ? *(ULONG *)argres[12] : 100 );
  569.                 stop_on_mouse = ( argres[13] ? FALSE : TRUE );
  570.                 stop_on_disk = ( argres[14] ? FALSE : TRUE );
  571.                 FreeArgs( rdargs );
  572.                 }
  573.             else PrintFault( IoErr(), "BServer" );
  574.             }
  575.         else
  576.             {
  577.             if ( IconBase = OpenLibrary( "icon.library", 37L ) )
  578.                 {
  579.                 char **tooltypes = (char **)ArgArrayInit( argc, argv );
  580.                 newbroker.nb_Pri = ArgInt( tooltypes, "CX_PRIORITY", 0 );
  581.                 strcpy( hotkey, ArgString( tooltypes, "CX_HOTKEY", "lalt b" ) );
  582.                 strcpy( blankkey, ArgString( tooltypes, "BLANKKEY", "ctrl lalt b" ) );
  583.                 delaySecs = ArgInt( tooltypes, "TIMEOUT", 60 );
  584.                 changeSecs = ArgInt( tooltypes, "CHANGETIME", 60 );
  585.                 briLevel = ArgInt( tooltypes, "BRIGHTNESS", 100 );
  586.                 sndLevel = ArgInt( tooltypes, "VOLUME", 100 );
  587.                 wleft = ArgInt( tooltypes, "WLEFT", ~0 );
  588.                 wtop = ArgInt( tooltypes, "WTOP", ~0 );
  589.                 strcpy( ListName, ArgString( tooltypes, "LIST", "ClientList" ) );
  590.                 PopUp =
  591.                     !Stricmp(ArgString(tooltypes, "CX_POPUP", "NO"), "YES" );
  592.                 RandomClient =
  593.                     !Stricmp(ArgString(tooltypes, "RANDOM", "YES"), "YES" );
  594.                 strcpy( DefaultModeName, ArgString( tooltypes, "DISPLAY", NULL ) );
  595.                 stop_on_mouse = 
  596.                     !Stricmp(ArgString(tooltypes, "NOMOUSE", "YES"), "YES" );
  597.                 stop_on_disk = 
  598.                     !Stricmp(ArgString(tooltypes, "NODISK", "YES"), "YES" );
  599.  
  600.                 ArgArrayDone();
  601.                 CloseLibrary( IconBase );
  602.                 }
  603.  
  604.             WBenchMsg = (struct WBStartup *)argv;
  605.             if ( WBenchMsg->sm_NumArgs - 1 )
  606.                 {
  607.                 register struct WBArg *arg = WBenchMsg->sm_ArgList;
  608.                 arg++;
  609.                 CurrentDir( arg->wa_Lock );
  610.                 strcpy( ListName, arg->wa_Name );
  611.                 }
  612.             }
  613.         CloseLibrary( UtilityBase );
  614.         }
  615.  
  616.     if ( stop_on_mouse )
  617.         bservernewmenus[5].nm_Flags |= CHECKED;
  618.     if ( stop_on_disk )
  619.         bservernewmenus[6].nm_Flags |= CHECKED;
  620.  
  621.     if ( list = CreateModeList() )
  622.         {
  623.         GetDisplayNodeFromName();
  624.         DeleteModeList();
  625.         }
  626.  
  627.     delayEvents = delaySecs * 10;
  628.     changeEvents = changeSecs * 10;
  629.  
  630.     if ( CxBase = OpenLibrary( "commodities.library", 37L ) )
  631.         {
  632.         if ( GadToolsBase = OpenLibrary( "gadtools.library", 0L ) )
  633.             {
  634.             if ( broker_mp = CreateMsgPort() )
  635.                 {
  636.                 CXSignal = 1L << broker_mp->mp_SigBit;
  637.                 newbroker.nb_Port = broker_mp;
  638.  
  639.                 if ( broker = CxBroker( &newbroker, NULL ) )
  640.                     {
  641.                     if ( (handlerSigBit = AllocSignal( -1 )) != -1 )
  642.                         {
  643.                         handlerSignal = 1L << handlerSigBit;
  644.  
  645.                         if ( (timerSigBit = AllocSignal( -1 )) != -1 )
  646.                             {
  647.                             timerSignal = 1L << timerSigBit;
  648.  
  649.                             thisTask = FindTask( NULL );
  650.  
  651.                             if ( customobj = CxCustom( BlankerAction, 0L ) )
  652.                                 {
  653.                                 AttachCxObj( broker, customobj );
  654.  
  655.                                 if ( hotkeyfilter = HotKey( hotkey, broker_mp, EVT_HOTKEY ) )
  656.                                     {
  657.                                     AttachCxObj( broker, hotkeyfilter );
  658.                                     if ( blankkeyfilter = HotKey( blankkey, broker_mp, EVT_BLANKKEY ) )
  659.                                         AttachCxObj( broker, blankkeyfilter );
  660.                                     }
  661.  
  662.                                 if ( !CxObjError( blankkeyfilter ) )
  663.                                     {
  664.                                     if ( firstNode = AllocVec( sizeof(struct ClientNode), MEMF_CLEAR ) )
  665.                                         {
  666.                                         NewList( &ClientsList );
  667.                                         firstNode->cn_Node.ln_Name = GetString( &li, MSG_BUILTIN_BLANKER );
  668.                                         AddTail( &ClientsList, (struct Node *)firstNode );
  669.  
  670.                                         if ( SetUpServerPort() )
  671.                                             {
  672.                                             GetClientNames( ListName );
  673.  
  674.                                             if ( PopUp )
  675.                                                 PopUpWindow();
  676.  
  677.                                             ActivateCxObj( broker, 1L );
  678.                                             ProcessUserMessages();
  679.                                             ShutWindow();
  680.                                             DropClientNames();
  681.                                             DeletePort( ServerPort );
  682.                                             }
  683.                                         else
  684.                                             FreeVec( firstNode );
  685.                                         }
  686.                                     }
  687.                                 }
  688.                             FreeSignal( timerSigBit );
  689.                             }
  690.                         FreeSignal( handlerSigBit );
  691.                         }
  692.                     DeleteCxObjAll( broker );
  693.                     }
  694.                 DeleteMsgPort( broker_mp );
  695.                 }
  696.             CloseLibrary( GadToolsBase );
  697.             }
  698.         CloseLibrary( CxBase );
  699.         }
  700.     CloseLibrary( (struct Library *)IntuitionBase );
  701.     }
  702.  
  703. if ( LocaleBase )
  704.     {
  705.     if ( li.li_Catalog )
  706.         CloseCatalog( li.li_Catalog );
  707.     CloseLibrary( LocaleBase );
  708.     }
  709. }
  710.